home *** CD-ROM | disk | FTP | other *** search
/ HTBasic 9.3 / HTBasic 9.3.iso / LgcyPlus / disk2 / RCKSCIPR._ / RCKSCIPR.
Encoding:
Text File  |  2001-03-02  |  9.2 KB  |  252 lines

  1. 10    ! ******************************************************************
  2. 20    ! Example: Rock/Paper/Scissors Game
  3. 30    !
  4. 40    ! This program is designed to show the operation of LABEL and
  5. 50    ! PUSHBUTTON widgets. It plays the game of "rock/paper/scissors"
  6. 60    ! in which each of two players guesses one of three items -
  7. 70    ! rock, paper, or scissors. The guesses are then compared
  8. 80    ! for the following outcomes:
  9. 90    !
  10. 100   !  - An identical guess is a tie
  11. 110   !  - Paper covers rock, paper wins
  12. 120   !  - Scissors cuts paper, scissors wins
  13. 130   !  - Rock breaks scissors, rock wins
  14. 140   !
  15. 150   ! The program sets up a panel with a large LABEL to prompt the user
  16. 160   ! for his or her guess, sets up a PUSHBUTTON for each guess, then
  17. 170   ! goes into a loop where it waits for PUSHBUTTON input.
  18. 180   !
  19. 190   ! Each one of the three PUSHBUTTON widgets causes an event that invokes
  20. 200   ! the appropriate handler routine. These three routines each contain
  21. 210   ! a SELECT statement that matches the PUSHBUTTON against a guess made
  22. 220   ! by the program -- rock, scissors, or paper.  On the basis of the
  23. 230   ! match, each routine then provides a dialog indicating the match and
  24. 240   ! calls the appropriate Win, Lose, or Tie routine.
  25. 250   !
  26. 260   ! ******************************************************************
  27. 270   !
  28. 280   RANDOMIZE INT(FRACT(TIMEDATE)*10^7)
  29. 290   !
  30. 300   ! Variables Used:
  31. 310   !
  32. 320   ! Me,You,Tie:            Store game outcomes
  33. 330   ! Rock,Paper,Scissors:   Guess values
  34. 340   ! B$,S$:                 General purpose strings
  35. 350   !
  36. 360   INTEGER Me,You,Tie,Rock,Paper,Scissors
  37. 370   DATA 0,0,0,0,1,2
  38. 380   READ Me,You,Tie,Rock,Paper,Scissors
  39. 390   !
  40. 400   INTEGER Black,White,Red,Yellow,Green,Cyan,Blue,Magenta
  41. 410   DATA 0,1,2,3,4,5,6,7
  42. 420   READ Black,White,Red,Yellow,Green,Cyan,Blue,Magenta
  43. 430   !
  44. 440   DIM B$[50],S$[100]
  45. 450   INTEGER Nlines,D(1:4),Dw,Dh         ! Variables for display handling
  46. 460   INTEGER Pw,Ph,Px,Py,Iw,Ih           ! PANEL dimensions & coordinates
  47. 470   INTEGER Gapw,Gaph,W1,H1,W2,H2       ! Widget scaling factors
  48. 480   INTEGER R1,R2,R3,R4,R5,R6,C1,C2,C3
  49. 490   !
  50. 500   ! Get display dimensions
  51. 510   !
  52. 520   STATUS CRT,13;Nlines
  53. 530   GESCAPE CRT,3;D(*)
  54. 540   Dw=D(3)-D(1)
  55. 550   Dh=(D(4)-D(2))*((Nlines-7)/Nlines)
  56. 560   !
  57. 570   Pw=Dw*.5
  58. 580   Ph=Dh*.8
  59. 590   Px=(Dw-Pw)/2
  60. 600   Py=(Dh-Ph)/2
  61. 610   !
  62. 620   CLEAR SCREEN
  63. 630   ASSIGN @Main TO WIDGET "PANEL";SET ("VISIBLE":0)
  64. 640   CONTROL @Main;SET ("MAXIMIZABLE":0,"RESIZABLE":0)
  65. 650   CONTROL @Main;SET ("X":Px,"Y":Py,"WIDTH":Pw,"HEIGHT":Ph)
  66. 660   CONTROL @Main;SET ("TITLE":" Example: Rock/Paper/Scissors Game")
  67. 670   CONTROL @Main;SET ("SYSTEM MENU":"Quit")
  68. 680   !
  69. 690   STATUS @Main;RETURN ("INSIDE WIDTH":Iw,"INSIDE HEIGHT":Ih)
  70. 700   !
  71. 710   Gapw=Iw*.03          ! Width gap
  72. 720   Gaph=Ih*.03          ! Height gap
  73. 730   W1=(Iw-Gapw*4)/3     ! Width of PUSHBUTTONs and most LABELS
  74. 740   H1=(Ih-Gaph*8)/4     ! Height of PUSHBUTTONs and all LABELS
  75. 750   W2=Iw-Gapw*2         ! Width of main LABEL and all SEPARATORs
  76. 760   H2=Gaph              ! Height of SEPARATORs
  77. 770   !
  78. 780   C1=Gapw              ! Column coordinates, based on PUSHBUTTON width
  79. 790   C2=C1+W1+Gapw
  80. 800   C3=C2+W1+Gapw
  81. 810   !
  82. 820   R1=Gaph              ! Row coordinates:  row for main LABEL
  83. 830   R2=R1+H1+Gaph        ! Row for first SEPARATOR
  84. 840   R3=R2+H2+Gaph        ! Row for input PUSHBUTTONs
  85. 850   R4=R3+H1+Gaph        ! Row for second SEPARATOR
  86. 860   R5=R4+H2             ! Row for result-title LABELs
  87. 870   R6=R5+H1             ! Row for result-value LABELs
  88. 880   !
  89. 890   ! Now add child widgets: main LABEL
  90. 900   !
  91. 910   ASSIGN @Label TO WIDGET "LABEL";PARENT @Main
  92. 920   CONTROL @Label;SET ("X":C1,"Y":R1,"WIDTH":W2,"HEIGHT":H1)
  93. 930   CONTROL @Label;SET ("BORDER":0,"BACKGROUND":Black,"PEN":Red)
  94. 940   CONTROL @Label;SET ("PEN":White,"VALUE":"Make a guess!")
  95. 950   !
  96. 960   ! Create SEPARATOR widget
  97. 970   !
  98. 980   ASSIGN @S1 TO WIDGET "SEPARATOR";PARENT @Main
  99. 990   CONTROL @S1;SET ("X":C1,"Y":R2,"WIDTH":W2,"HEIGHT":H2)
  100. 1000  !
  101. 1010  ! User input keys
  102. 1020  !
  103. 1030  ASSIGN @Rock TO WIDGET "PUSHBUTTON";PARENT @Main
  104. 1040  CONTROL @Rock;SET ("X":C1,"Y":R3,"WIDTH":W1,"HEIGHT":H1)
  105. 1050  CONTROL @Rock;SET ("BACKGROUND":Blue,"PEN":White)
  106. 1060  CONTROL @Rock;SET ("LABEL":"ROCK")
  107. 1070  !
  108. 1080  ASSIGN @Scissors TO WIDGET "PUSHBUTTON";PARENT @Main
  109. 1090  CONTROL @Scissors;SET ("X":C2,"Y":R3,"WIDTH":W1,"HEIGHT":H1)
  110. 1100  CONTROL @Scissors;SET ("BACKGROUND":Blue,"PEN":White)
  111. 1110  CONTROL @Scissors;SET ("LABEL":"SCISSORS")
  112. 1120  !
  113. 1130  ASSIGN @Paper TO WIDGET "PUSHBUTTON";PARENT @Main
  114. 1140  CONTROL @Paper;SET ("X":C3,"Y":R3,"WIDTH":W1,"HEIGHT":H1)
  115. 1150  CONTROL @Paper;SET ("BACKGROUND":Blue,"PEN":White)
  116. 1160  CONTROL @Paper;SET ("LABEL":"PAPER")
  117. 1170  !
  118. 1180  ! Next SEPARATOR widget
  119. 1190  !
  120. 1200  ASSIGN @S2 TO WIDGET "SEPARATOR";PARENT @Main
  121. 1210  CONTROL @S2;SET ("X":C1,"Y":R4,"WIDTH":W2,"HEIGHT":H2)
  122. 1220  !
  123. 1230  ! Results titles and values. Note that none of these LABELS have
  124. 1240  ! borders; the titles also have backgrounds that have the same color
  125. 1250  ! as the PANEL background, so they appear to be written directly on
  126. 1260  ! the PANEL.
  127. 1270  !
  128. 1280  ASSIGN @Me_title TO WIDGET "LABEL";PARENT @Main
  129. 1290  CONTROL @Me_title;SET ("X":C1,"Y":R5,"WIDTH":W1,"HEIGHT":H1)
  130. 1300  CONTROL @Me_title;SET ("BORDER":0,"VALUE":"ME")
  131. 1310  !
  132. 1320  ASSIGN @Me_value TO WIDGET "LABEL";PARENT @Main
  133. 1330  CONTROL @Me_value;SET ("X":C1,"Y":R6,"WIDTH":W1,"HEIGHT":H1)
  134. 1340  CONTROL @Me_value;SET ("BORDER":0,"BACKGROUND":Black,"PEN":Red)
  135. 1350  CONTROL @Me_value;SET ("VALUE":Me)
  136. 1360  !
  137. 1370  ASSIGN @You_title TO WIDGET "LABEL";PARENT @Main
  138. 1380  CONTROL @You_title;SET ("X":C2,"Y":R5,"WIDTH":W1,"HEIGHT":H1)
  139. 1390  CONTROL @You_title;SET ("BORDER":0,"VALUE":"YOU")
  140. 1400  !
  141. 1410  ASSIGN @You_value TO WIDGET "LABEL";PARENT @Main
  142. 1420  CONTROL @You_value;SET ("X":C2,"Y":R6,"WIDTH":W1,"HEIGHT":H1)
  143. 1430  CONTROL @You_value;SET ("BORDER":0,"BACKGROUND":Black,"PEN":Green)
  144. 1440  CONTROL @You_value;SET ("VALUE":You)
  145. 1450  !
  146. 1460  ASSIGN @Tie_title TO WIDGET "LABEL";PARENT @Main
  147. 1470  CONTROL @Tie_title;SET ("X":C3,"Y":R5,"WIDTH":W1,"HEIGHT":H1)
  148. 1480  CONTROL @Tie_title;SET ("BORDER":0,"VALUE":"TIE")
  149. 1490  !
  150. 1500  ASSIGN @Tie_value TO WIDGET "LABEL";PARENT @Main
  151. 1510  CONTROL @Tie_value;SET ("X":C3,"Y":R6,"WIDTH":W1,"HEIGHT":H1)
  152. 1520  CONTROL @Tie_value;SET ("BORDER":0,"BACKGROUND":Black,"PEN":Yellow)
  153. 1530  CONTROL @Tie_value;SET ("VALUE":Tie)
  154. 1540  !
  155. 1550  ! PANEL completed, set up EVENTS
  156. 1560  !
  157. 1570  ON EVENT @Rock,"ACTIVATED" GOSUB Gotrock
  158. 1580  ON EVENT @Scissors,"ACTIVATED" GOSUB Gotscissors
  159. 1590  ON EVENT @Paper,"ACTIVATED" GOSUB Gotpaper
  160. 1600  ON EVENT @Main,"SYSTEM MENU" GOTO Finis
  161. 1610  !
  162. 1620  ! Turn on the PANEL, make everything visible, then loop
  163. 1630  !
  164. 1640  CONTROL @Main;SET ("VISIBLE":1)
  165. 1650  !
  166. 1660  ! Main loop, set random-number seed, then loop
  167. 1670  !
  168. 1680  LOOP
  169. 1690    WAIT FOR EVENT
  170. 1700  END LOOP
  171. 1710  STOP
  172. 1720  !
  173. 1730  ! ****************  End of Main Program **********************
  174. 1740  !
  175. 1750  ! The three following handler routines are all basically similar:
  176. 1760  ! each is invoked by one of the three PUSHBUTTONs and uses a SELECT
  177. 1770  ! statement to figure the appropriate outcome. For each outcome, it
  178. 1780  ! loads a string with the appropriate result and calls the appropriate
  179. 1790  ! Win, Lose, or Tie routine.
  180. 1800  !
  181. 1810 Gotrock: !
  182. 1820  SELECT INT(3*RND)
  183. 1830  CASE Rock
  184. 1840    B$="ROCK ON ROCK"
  185. 1850    GOSUB Tie
  186. 1860  CASE Scissors
  187. 1870    B$="ROCK BREAKS SCISSORS"
  188. 1880    GOSUB Win
  189. 1890  CASE Paper
  190. 1900    B$="PAPER COVERS ROCK"
  191. 1910    GOSUB Lose
  192. 1920  END SELECT
  193. 1930  RETURN
  194. 1940  !
  195. 1950 Gotscissors: !
  196. 1960  SELECT INT(3*RND)
  197. 1970  CASE Rock
  198. 1980    B$="ROCK BREAKS SCISSORS"
  199. 1990    GOSUB Lose
  200. 2000  CASE Scissors
  201. 2010    B$="SCISSORS ON SCISSORS"
  202. 2020    GOSUB Tie
  203. 2030  CASE Paper
  204. 2040    B$="SCISSORS CUTS PAPER"
  205. 2050    GOSUB Win
  206. 2060  END SELECT
  207. 2070  RETURN
  208. 2080  !
  209. 2090 Gotpaper: !
  210. 2100  SELECT INT(3*RND)
  211. 2110  CASE Rock
  212. 2120    B$="PAPER COVERS ROCK"
  213. 2130    GOSUB Win
  214. 2140  CASE Scissors
  215. 2150    B$="SCISSORS CUTS PAPER"
  216. 2160    GOSUB Lose
  217. 2170  CASE Paper
  218. 2180    B$="PAPER ON PAPER"
  219. 2190    GOSUB Tie
  220. 2200  END SELECT
  221. 2210  RETURN
  222. 2220  !
  223. 2230  ! The three results routines -- Win, Tie, Lose -- are also similar to
  224. 2240  ! each other. Each takes the result of the match from the calling
  225. 2250  ! routine, concatenates it with the appropriate conclusion, displays
  226. 2260  ! it with a dialog, then increments the appropriate tally and returns.
  227. 2270  !
  228. 2280 Win: !
  229. 2290  S$=B$&": You WIN!"
  230. 2300  DIALOG "INFORMATION",S$;SET ("TITLE":" Results","PEN":Green)
  231. 2310  You=You+1
  232. 2320  CONTROL @You_value;SET ("VALUE":You)
  233. 2330  RETURN
  234. 2340  !
  235. 2350 Tie: !
  236. 2360  S$=B$&": Tie!"
  237. 2370  DIALOG "INFORMATION",S$;SET ("TITLE":" Results","PEN":Yellow)
  238. 2380  Tie=Tie+1
  239. 2390  CONTROL @Tie_value;SET ("VALUE":Tie)
  240. 2400  RETURN
  241. 2410  !
  242. 2420 Lose: !
  243. 2430  S$=B$&": You LOSE!"
  244. 2440  DIALOG "INFORMATION",S$;SET ("TITLE":" Results","PEN":Red)
  245. 2450  Me=Me+1
  246. 2460  CONTROL @Me_value;SET ("VALUE":Me)
  247. 2470  RETURN
  248. 2480  !
  249. 2490 Finis: !
  250. 2500  ASSIGN @Main TO *    ! Delete the PANEL widget
  251. 2510  END
  252.